/*
    在封装ajax的时候要充分的想到有可能会发生的情况，如因为网速问题，造成等待时间过长时的处理
        在这种情况就应该直接终止请求
    我们传递的url地址中的内容时不能够出现中文的，需要使用JS提供的encodeURI()方法进行转码
        英文不会受影响，中文会被转码
*/ 
function myAjax(method, url, obj, time, success, errors) { 
    let str = fromatobj(obj)
    let xmlhttp;
    let timeout
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (method.toUpperCase() === 'GET') {
        xmlhttp.open(method.toUpperCase(), encodeURI(url)+'?'+str, true)
        xmlhttp.send()
        xmlhttp.onreadystatechange = () => {
            clearTimeout(timeout)
            if (xmlhttp.readyState === 4) {
                if (xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status === 304) {
                    success(xmlhttp.responseText)
                } else {
                    errors('请求失败')
                }
            }
        }
    } else if (method.toUpperCase() === 'POST') { 
        xmlhttp.open(method.toUpperCase(),url,true)
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded")
        // POST传递的数据是放在send()方法里当参数传递的
        xmlhttp.send(JSON.stringify(str))
        xmlhttp.onreadystatechange = ()=>{
            if(xmlhttp.readyState === 4){
                if(xmlhttp.status >= 200&&xmlhttp.status < 300||xmlhttp.status === 304){
                    alert(xmlhttp.responseText)
                    console.log(xmlhttp.responseText)
                }else{
                    alert('请求失败')
                }
            }
        }
    }
    
    if (time) { 
        timeout = setTimeout(() => { 
            // abort()方法是终止请求
            xmlhttp.abort()
            console.log('请求失败')
            clearTimeout(timeout)
        },time)
    }
}

function fromatobj(obj) { 
    let arr = []
    for (const key in obj) {
        arr.push(`${encodeURI(key)} = ${encodeURI(obj[key])}`)
    }
    return arr.join('&')
}